{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "# 电影评论分类：二分类问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:05.300410Z",
     "start_time": "2020-05-12T16:09:02.061819Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((25000,), (25000,))"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 1. 数据集 ###############################\n",
    "###############################################\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.datasets import imdb\n",
    "\n",
    "# 将 mnist.npz 和 imdb_word_index.json 文件下载到 ~/.keras/datasets 文件夹中\n",
    "(train_data, train_labels), (test_data,\n",
    "                             test_labels) = imdb.load_data(num_words=10000)\n",
    "\n",
    "# num_words=10000, 仅保留数据集中1000个最常出现的单词\n",
    "\n",
    "train_data.shape, test_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:05.303988Z",
     "start_time": "2020-05-12T16:09:05.301572Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练数据\n",
    "train_data[0][:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:05.307229Z",
     "start_time": "2020-05-12T16:09:05.304986Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练标签\n",
    "train_labels[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:05.347609Z",
     "start_time": "2020-05-12T16:09:05.308079Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"? this film was just brilliant casting location scenery story direction everyone's really suited the\""
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 原始文本\n",
    "\n",
    "word_index = imdb.get_word_index()\n",
    "reverse_word_index = dict([(value, key)\n",
    "                           for (key, value) in word_index.items()])\n",
    "decoded_review = ' '.join(\n",
    "    reverse_word_index.get(i - 3, '?') for i in train_data[0])\n",
    "\n",
    "decoded_review[:100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:06.356174Z",
     "start_time": "2020-05-12T16:09:05.348503Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25000, 10000)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 2. 数据标准化 ############################\n",
    "###############################################\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "# one-hot 向量，\n",
    "def vectorize_sequences(sequences, dimension=10000):\n",
    "    results = np.zeros((len(sequences), dimension))\n",
    "    for i, sequence in enumerate(sequences):\n",
    "        results[i, sequence] = 1.\n",
    "    return (results)\n",
    "\n",
    "\n",
    "x_train = vectorize_sequences(train_data)\n",
    "x_test = vectorize_sequences(test_data)\n",
    "\n",
    "y_train = np.asarray(train_labels).astype('float32')\n",
    "y_test = np.asarray(test_labels).astype('float32')\n",
    "\n",
    "x_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:06.929527Z",
     "start_time": "2020-05-12T16:09:06.357516Z"
    },
    "hidden": true
   },
   "outputs": [],
   "source": [
    "###### 3. 构建网络 #############################\n",
    "###############################################\n",
    "# 两个中间层，每层16个神经元，使用 relu 激活函数\n",
    "# 第三层输出标量，预测结果，使用 sigmoid 激活函数\n",
    "\n",
    "from tensorflow.keras import models\n",
    "from tensorflow.keras import layers\n",
    "\n",
    "model = models.Sequential()\n",
    "model.add(layers.Dense(16, activation='relu', input_shape=(10000, )))\n",
    "model.add(layers.Dense(16, activation='relu'))\n",
    "model.add(layers.Dense(1, activation='sigmoid'))\n",
    "\n",
    "model.compile(optimizer='rmsprop',\n",
    "              loss='binary_crossentropy',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:20.236182Z",
     "start_time": "2020-05-12T16:09:06.930686Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 15000 samples, validate on 10000 samples\n",
      "Epoch 1/20\n",
      "15000/15000 - 1s - loss: 0.5171 - accuracy: 0.7896 - val_loss: 0.4010 - val_accuracy: 0.8671\n",
      "Epoch 2/20\n",
      "15000/15000 - 1s - loss: 0.3197 - accuracy: 0.9025 - val_loss: 0.3149 - val_accuracy: 0.8894\n",
      "Epoch 3/20\n",
      "15000/15000 - 1s - loss: 0.2330 - accuracy: 0.9266 - val_loss: 0.2940 - val_accuracy: 0.8842\n",
      "Epoch 4/20\n",
      "15000/15000 - 1s - loss: 0.1833 - accuracy: 0.9422 - val_loss: 0.2778 - val_accuracy: 0.8895\n",
      "Epoch 5/20\n",
      "15000/15000 - 1s - loss: 0.1476 - accuracy: 0.9550 - val_loss: 0.2780 - val_accuracy: 0.8890\n",
      "Epoch 6/20\n",
      "15000/15000 - 1s - loss: 0.1246 - accuracy: 0.9633 - val_loss: 0.2912 - val_accuracy: 0.8845\n",
      "Epoch 7/20\n",
      "15000/15000 - 1s - loss: 0.1026 - accuracy: 0.9706 - val_loss: 0.3067 - val_accuracy: 0.8852\n",
      "Epoch 8/20\n",
      "15000/15000 - 1s - loss: 0.0857 - accuracy: 0.9765 - val_loss: 0.3203 - val_accuracy: 0.8833\n",
      "Epoch 9/20\n",
      "15000/15000 - 1s - loss: 0.0706 - accuracy: 0.9819 - val_loss: 0.3427 - val_accuracy: 0.8797\n",
      "Epoch 10/20\n",
      "15000/15000 - 1s - loss: 0.0582 - accuracy: 0.9861 - val_loss: 0.3662 - val_accuracy: 0.8793\n",
      "Epoch 11/20\n",
      "15000/15000 - 1s - loss: 0.0471 - accuracy: 0.9891 - val_loss: 0.4036 - val_accuracy: 0.8742\n",
      "Epoch 12/20\n",
      "15000/15000 - 1s - loss: 0.0365 - accuracy: 0.9930 - val_loss: 0.4570 - val_accuracy: 0.8699\n",
      "Epoch 13/20\n",
      "15000/15000 - 1s - loss: 0.0321 - accuracy: 0.9937 - val_loss: 0.4515 - val_accuracy: 0.8735\n",
      "Epoch 14/20\n",
      "15000/15000 - 1s - loss: 0.0224 - accuracy: 0.9971 - val_loss: 0.4843 - val_accuracy: 0.8727\n",
      "Epoch 15/20\n",
      "15000/15000 - 1s - loss: 0.0175 - accuracy: 0.9980 - val_loss: 0.5296 - val_accuracy: 0.8702\n",
      "Epoch 16/20\n",
      "15000/15000 - 1s - loss: 0.0145 - accuracy: 0.9981 - val_loss: 0.5574 - val_accuracy: 0.8693\n",
      "Epoch 17/20\n",
      "15000/15000 - 1s - loss: 0.0130 - accuracy: 0.9979 - val_loss: 0.5895 - val_accuracy: 0.8669\n",
      "Epoch 18/20\n",
      "15000/15000 - 1s - loss: 0.0074 - accuracy: 0.9997 - val_loss: 0.6435 - val_accuracy: 0.8653\n",
      "Epoch 19/20\n",
      "15000/15000 - 1s - loss: 0.0113 - accuracy: 0.9977 - val_loss: 0.6493 - val_accuracy: 0.8670\n",
      "Epoch 20/20\n",
      "15000/15000 - 1s - loss: 0.0040 - accuracy: 0.9999 - val_loss: 0.6803 - val_accuracy: 0.8635\n"
     ]
    }
   ],
   "source": [
    "###### 4. 训练模型 #############################\n",
    "###############################################\n",
    "\n",
    "x_val = x_train[:10000]\n",
    "partial_x_train = x_train[10000:]\n",
    "\n",
    "y_val = y_train[:10000]\n",
    "partial_y_train = y_train[10000:]\n",
    "\n",
    "history = model.fit(partial_x_train,\n",
    "                    partial_y_train,\n",
    "                    epochs=20,\n",
    "                    batch_size=512,\n",
    "                    verbose=2,\n",
    "                    validation_data=(x_val, y_val))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:20.660914Z",
     "start_time": "2020-05-12T16:09:20.237108Z"
    },
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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/300oZdp+PDh3HXXXZU+jqSe778PhVUfegiuvhqOPz7U+GrdGn7xCxgyBN58E1q2hN/8JjzXyV0kOhWp1p6TEzrUFxaGn9H8f6vIPlK11BIWA/3792fy5Mmccsop29dNnjyZUaNGRbX/AQccwNNPP13h9x89ejQXXXQRdSNtzy+99FKFjyXVW2EhnHUWPP/8jnWNGkGnTtC/f/jZqRN07Jh8hVdFUkVVT58nyUstYTFw7rnn8sILL/Djjz8CsGzZMlauXEn37t3ZsGEDP/vZz8jKyqJTp04899xzu+2/bNkyOnbsCMCmTZvo168fmZmZXHDBBWzatGn7dldddRXZ2dl06NCBYcOGATBmzBhWrlxJr1696NWrFwAZGRl8++23ANxzzz107NiRjh07Mnr06O3vd8QRR/DLX/6SDh06cPLJJ+/0PiWZO3cuxxxzDJmZmZx99tmsWbNm+/u3b9+ezMzM7ROHv/nmm3Tp0oUuXbpw5JFHsn79+gp/tlK1HnkkJGDXXRcq3K9YAWvWwNtv794qJiI7lKePlzrNy3alFRBL1keyFms99dRT/dlnn3V399tvv91vuOEGdw8V7NeuXevu7qtXr/aDDjrICwsL3d29Xr167u7++eefe4cOHdzd/e677/bLL7/c3d3nzZvnNWvW9FmzZrm7e35+vru7FxQUeI8ePXzevHnu7t6mTRtfvXr19liKlnNzc71jx46+YcMGX79+vbdv394//PBD//zzz71mzZo+Z84cd3c/77zz/Iknntjtdxo2bJiPGjXK3d07derkb7zxhru733rrrX7ddde5u3uLFi18c6Qa55o1a9zd/bTTTvOZM2e6u/v69etLrNifDH8z2dnXX7s3aeLes2couJpMULFWSWJVURhVUldZ56+0ux35m9/A3LmxPWaXLhBpRCpV0S3JM888k8mTJzN+fJhSzt25+eabeeutt6hRowZffvklX3/9Nfvvv3+Jx3nrrbe49tprAcjMzCQzM3P7a1OmTGHcuHEUFBSwatUqFi5cuNPru5o5cyZnn3029erVA6Bv3768/fbbnHHGGbRt25YuXboA0LVrV5aVVr0PWLt2Ld9//z09evQA4NJLL+W8887bHmNOTg5nnXUWZ511FgDHHXccv/3tb8nJyaFv3760atWq7A9PksKNN8KGDaHFS6MbRaJXVh+vWHW0l/Sk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\n",
      "text/plain": [
       "<Figure size 720x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "###### 5. 检查训练过程 ##########################\n",
    "###############################################\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "acc = history.history['accuracy']\n",
    "val_acc = history.history['val_accuracy']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "\n",
    "epochs = range(1, len(acc) + 1)\n",
    "f, axes = plt.subplots(1, 2, figsize=(10, 5))\n",
    "\n",
    "axes[0].plot(epochs, loss, 'bo', label='Training loss')\n",
    "axes[0].plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "axes[0].set_title('Training and validation loss')\n",
    "axes[0].set_xlabel('Epochs')\n",
    "axes[0].set_ylabel('Loss')\n",
    "axes[0].legend()\n",
    "\n",
    "axes[1].plot(epochs, acc, 'bo', label='Training acc')\n",
    "axes[1].plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "axes[1].set_title('Training and validation acc')\n",
    "axes[1].set_xlabel('Epochs')\n",
    "axes[1].set_ylabel('acc')\n",
    "axes[1].legend()\n",
    "\n",
    "plt.show()\n",
    "\n",
    "# 从图中可知，模型过拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 新闻分类：多分类问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:20.663828Z",
     "start_time": "2020-05-12T16:09:20.661879Z"
    }
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from tensorflow.keras.datasets import reuters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:21.042494Z",
     "start_time": "2020-05-12T16:09:20.664755Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((8982,), (8982,))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 1. 数据集 ###############################\n",
    "###############################################\n",
    "(train_data, train_labels), (test_data,\n",
    "                             test_labels) = reuters.load_data(num_words=10000)\n",
    "\n",
    "train_data.shape, train_labels.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:21.065160Z",
     "start_time": "2020-05-12T16:09:21.043354Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'? ? ? said as a result of its december acquisition of space co it expects earnings per share in 1987 of 1 15 to 1 30 dlrs per share up from 70 cts in 1986 the company said pretax net should rise to nine to 10 mln dlrs from six mln dlrs in 1986 and rental operation revenues to 19 to 22 mln dlrs from 12 5 mln dlrs it said cash flow per share this year should be 2 50 to three dlrs reuter 3'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 原始文本\n",
    "word_index = reuters.get_word_index()\n",
    "reversed_word_index = dict([(value, key)\n",
    "                            for (key, value) in word_index.items()])\n",
    "decoded_news = ' '.join(\n",
    "    [reversed_word_index.get(i - 3, '?') for i in train_data[0]])\n",
    "\n",
    "decoded_news"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:21.260440Z",
     "start_time": "2020-05-12T16:09:21.066058Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((8982, 10000), (2246, 10000))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 2. 数据标准化 ############################\n",
    "###############################################\n",
    "\n",
    "# 每个文档转化成，词汇表大小的向量\n",
    "def vectorize_sequences(sequences, dimension=10000):\n",
    "    results = np.zeros((len(sequences), dimension))\n",
    "    for i, sequence in enumerate(sequences):\n",
    "        results[i, sequence] = 1.\n",
    "    return (results)\n",
    "\n",
    "\n",
    "x_train = vectorize_sequences(train_data)\n",
    "x_test = vectorize_sequences(test_data)\n",
    "x_train.shape, x_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:21.266552Z",
     "start_time": "2020-05-12T16:09:21.261390Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(8982, 46)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def to_one_hot(labels, dimension=46):\n",
    "    results = np.zeros((len(labels), dimension))\n",
    "    for i, label in enumerate(labels):\n",
    "        results[i, label] = 1.\n",
    "    return (results)\n",
    "\n",
    "\n",
    "# 标签 one-hot 向量\n",
    "one_hot_train_labels = to_one_hot(train_labels)\n",
    "one_hot_test_labels = to_one_hot(test_labels)\n",
    "\n",
    "# 46 分类问题\n",
    "one_hot_train_labels.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:21.305909Z",
     "start_time": "2020-05-12T16:09:21.267362Z"
    }
   },
   "outputs": [],
   "source": [
    "###### 3. 构建模型 #############################\n",
    "###############################################\n",
    "from tensorflow.keras import models\n",
    "from tensorflow.keras import layers\n",
    "\n",
    "model = models.Sequential()\n",
    "model.add(layers.Dense(64, activation='relu', input_shape=(10000, )))\n",
    "model.add(layers.Dense(64, activation='relu'))\n",
    "model.add(layers.Dense(46, activation='softmax'))\n",
    "\n",
    "model.compile(optimizer='rmsprop',\n",
    "              loss='categorical_crossentropy',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:27.313604Z",
     "start_time": "2020-05-12T16:09:21.306657Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 7982 samples, validate on 1000 samples\n",
      "Epoch 1/20\n",
      "7982/7982 [==============================] - 1s 82us/sample - loss: 2.6289 - accuracy: 0.4961 - val_loss: 1.7985 - val_accuracy: 0.6400\n",
      "Epoch 2/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 1.4465 - accuracy: 0.6982 - val_loss: 1.3437 - val_accuracy: 0.6990\n",
      "Epoch 3/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 1.0765 - accuracy: 0.7686 - val_loss: 1.1705 - val_accuracy: 0.7320\n",
      "Epoch 4/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.8446 - accuracy: 0.8166 - val_loss: 1.0647 - val_accuracy: 0.7740\n",
      "Epoch 5/20\n",
      "7982/7982 [==============================] - 0s 32us/sample - loss: 0.6721 - accuracy: 0.8559 - val_loss: 0.9581 - val_accuracy: 0.8050\n",
      "Epoch 6/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.5368 - accuracy: 0.8869 - val_loss: 0.9279 - val_accuracy: 0.8090\n",
      "Epoch 7/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.4283 - accuracy: 0.9082 - val_loss: 0.8813 - val_accuracy: 0.8170\n",
      "Epoch 8/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.3457 - accuracy: 0.9268 - val_loss: 0.8863 - val_accuracy: 0.8180\n",
      "Epoch 9/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.2855 - accuracy: 0.9366 - val_loss: 0.8760 - val_accuracy: 0.8280\n",
      "Epoch 10/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.2381 - accuracy: 0.9446 - val_loss: 0.8988 - val_accuracy: 0.8180\n",
      "Epoch 11/20\n",
      "7982/7982 [==============================] - 0s 32us/sample - loss: 0.2074 - accuracy: 0.9480 - val_loss: 0.9052 - val_accuracy: 0.8180\n",
      "Epoch 12/20\n",
      "7982/7982 [==============================] - 0s 34us/sample - loss: 0.1820 - accuracy: 0.9523 - val_loss: 0.9185 - val_accuracy: 0.8130\n",
      "Epoch 13/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.1619 - accuracy: 0.9535 - val_loss: 0.9632 - val_accuracy: 0.8100\n",
      "Epoch 14/20\n",
      "7982/7982 [==============================] - 0s 34us/sample - loss: 0.1527 - accuracy: 0.9554 - val_loss: 0.9759 - val_accuracy: 0.8050\n",
      "Epoch 15/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.1360 - accuracy: 0.9568 - val_loss: 1.0156 - val_accuracy: 0.8060\n",
      "Epoch 16/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.1335 - accuracy: 0.9549 - val_loss: 0.9932 - val_accuracy: 0.8170\n",
      "Epoch 17/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.1261 - accuracy: 0.9565 - val_loss: 1.0069 - val_accuracy: 0.8160\n",
      "Epoch 18/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.1192 - accuracy: 0.9584 - val_loss: 1.0555 - val_accuracy: 0.7990\n",
      "Epoch 19/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.1135 - accuracy: 0.9592 - val_loss: 1.0687 - val_accuracy: 0.8060\n",
      "Epoch 20/20\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.1107 - accuracy: 0.9578 - val_loss: 1.0560 - val_accuracy: 0.8090\n"
     ]
    }
   ],
   "source": [
    "###### 4. 训练模型 ##############################\n",
    "###############################################\n",
    "x_val = x_train[:1000]\n",
    "partial_x_train = x_train[1000:]\n",
    "\n",
    "y_val = one_hot_train_labels[:1000]\n",
    "partial_y_train = one_hot_train_labels[1000:]\n",
    "\n",
    "history = model.fit(partial_x_train,\n",
    "                    partial_y_train,\n",
    "                    epochs=20,\n",
    "                    batch_size=512,\n",
    "                    validation_data=(x_val, y_val))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:27.398069Z",
     "start_time": "2020-05-12T16:09:27.314553Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "###### 5. 查看模型训练过程 #######################\n",
    "###############################################\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "\n",
    "epochs = range(1, len(loss) + 1)\n",
    "\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:27.482378Z",
     "start_time": "2020-05-12T16:09:27.398996Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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c2fuueee4mV79erFggULKCoqomXLlowZM4bMzEx69uzJt99+C8Cdd97Jww8/XLz8mDFj6N69Oz/5yU+YPXs2AN9//z0DBgwgMzOTwYMHk52dXZykIt11112ceuqpxfGFh+r96quvOPvss8nMzCQrK4sVK1YA8Mc//pEuXbqQmZnJ2NDBCscM8M033/DjH/8YgL/+9a8MGjSICy+8kP79+7Nt2zbOPvtssrKyyMjI4K233iqO49lnnyUjI4PMzEyGDh3Kli1bOO644ygqKgJgy5YtdOzYkX379lXb36U8SgQiSWDVqspNr6rFixdzzTXXMH/+fNq1a8ef/vQn8vLyyM/PZ9q0aSxevPigdbZu3cqZZ55Jfn4+PXv25Jlnnom6beccn332GQ888EBxUnnsscc4+uijyc/PZ8yYMcyfPz/qujfeeCNz5sxh4cKFbN26lXfffReAwYMHc9NNN5Gfn8/s2bM58sgjmTJlCu+88w6fffYZ+fn53HzzzRV+7o8//pgXX3yRadOm0bhxY9544w3mzZvH9OnTuemmmwDIz8/n/vvv5/333yc/P58JEybQsmVLTj/99OJ4/va3v/HLX/6S+vXrV3ywq4ESgUgS6NChctOr6vjjj+fUU08tfv/yyy+TlZVFVlYWS5YsiZoIGjduTP/+/QE45ZRTin+Vl3bppZcetMxHH33EoEGDAMjMzKRz585R150xYwbdu3cnMzOTWbNmsWjRIjZv3szGjRv5+c9/Dvgbspo0acL06dMZNmwYjRs3BuCII46o8HP37duXVq1aAT5h3X777WRkZNC3b19Wr17Nxo0b+de//sXAgQOLtxd+Hj58eHFT2bPPPsvQoUMr3F91USIQSQLjxkGTJiWnNWnipwfh8MMPL369dOlSHnnkEf71r39RUFBAv379ol7n3qhRo+LX9evXL24mKe2www47aJlwE095du7cyciRI3n99dcpKChg2LBhxXFEu+TSORd1eoMGDdi/fz/AQZ8j8nO/8MILbN26lXnz5rFgwQLatGnD7t27y9zumWeeyVdffcXMmTNp2LAhJ554YoWfqbooEYgkgSFDICcHUlPBzD/n5Bz6ieLK2LZtG82aNaN58+asW7eOqVOnVvs+evXqxeTJkwFYuHBh1BrHrl27qFevHm3atGH79u289tprALRq1Yo2bdowZcoUwBfuO3fupG/fvjz99NPs2rULgO+++w6AtLQ05s6dC8Crr75aZkxbt27lyCOPpEGDBkybNo01a9YAcO655zJp0qTi7YWfAf7jP/6DIUOGxLU2AEoEIkljyBBYsQL27/fP8UgCAFlZWZx88smkp6dz7bXXcvrpp1f7PkaNGsWaNWvIyMhgwoQJpKen06JFixLLtG7dmquuuor09HQuueQSevToUTwvNzeXCRMmkJGRQa9evdiwYQMXXngh/fr1Izs7m65du/LnP/8ZgFtvvZVHHnmE0047jc2bN5cZ0xVXXMHs2bPJzs7mlVdeoVOnTgBkZGRw22230bt3b7p27cqtt95avM6QIUPYunUrAwcOrM7DUyGLpUpVk2RnZ7u8vLxEhyGScEuWLOGkk05KdBg1QlFREUVFRaSkpLB06VL69u3L0qVLa9UlnACTJk1i6tSpMV1WW55o3w0zm+ucy462fO06SiIiUezYsYNzzjmHoqIinHM8+eSTtS4JXH/99UyfPr34yqF4ql1HSkQkipYtWxa329dWEydOTNi+dY5ARCTJKRGIiCQ5JQIRkSSnRCAikuSUCETkkPTp0+egm8Mefvhhfv3rX5e7XtOmTQFYu3Ytl112WZnbrugy8YcffpidET3pnX/++WzZsiWW0KUUJQIROSSDBw9m0qRJJaZNmjSJwYMHx7T+McccU+6duRUpnQjefvttWrZsecjbizfnXHFXFYmmRCBSB/zmN9CnT/U+fvOb8vd52WWX8dZbb/HDDz8AsGLFCtauXUuvXr2Kr+vPysqiS5cuvPHGGwetv2LFCtLT0wHf/cOgQYPIyMhg4MCBxd06gL++PtyF9V133QXAo48+ytq1aznrrLM466yzAN/1w8aNGwF46KGHSE9PJz09vbgL6xUrVnDSSSdx7bXX0rlzZ/r27VtiP2FTpkyhR48edOvWjXPPPZf169cD/l6FoUOH0qVLFzIyMoq7qHj33XfJysoiMzOTc845B/DjMzz44IPF20xPT2fFihXFMfz6178mKyuL1atXR/18AHPmzOG0004jMzOT7t27s337ds4444wS3WuffvrpFBQUlP+HikGgicDM+pnZl2a2zMzGRJl/tZltMLMFocfwIOMRkerTunVrunfvXnwD1KRJkxg4cCBmRkpKCq+//jrz5s1j5syZ3HzzzeV2DDdx4kSaNGlCQUEBY8eO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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()\n",
    "\n",
    "acc = history.history['accuracy']\n",
    "val_acc = history.history['val_accuracy']\n",
    "\n",
    "plt.plot(epochs, acc, 'bo', label='Training accuracy')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.463105Z",
     "start_time": "2020-05-12T16:09:27.484256Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 7982 samples, validate on 1000 samples\n",
      "Epoch 1/9\n",
      "7982/7982 [==============================] - 1s 73us/sample - loss: 2.6269 - accuracy: 0.5356 - val_loss: 1.7016 - val_accuracy: 0.6590\n",
      "Epoch 2/9\n",
      "7982/7982 [==============================] - 0s 32us/sample - loss: 1.3993 - accuracy: 0.7196 - val_loss: 1.2797 - val_accuracy: 0.7290\n",
      "Epoch 3/9\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 1.0312 - accuracy: 0.7830 - val_loss: 1.1086 - val_accuracy: 0.7680\n",
      "Epoch 4/9\n",
      "7982/7982 [==============================] - 0s 32us/sample - loss: 0.8004 - accuracy: 0.8305 - val_loss: 1.0102 - val_accuracy: 0.7860\n",
      "Epoch 5/9\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.6353 - accuracy: 0.8659 - val_loss: 0.9234 - val_accuracy: 0.8060\n",
      "Epoch 6/9\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.4989 - accuracy: 0.8981 - val_loss: 0.8800 - val_accuracy: 0.8120\n",
      "Epoch 7/9\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.4053 - accuracy: 0.9158 - val_loss: 0.8879 - val_accuracy: 0.8060\n",
      "Epoch 8/9\n",
      "7982/7982 [==============================] - 0s 32us/sample - loss: 0.3299 - accuracy: 0.9311 - val_loss: 0.8708 - val_accuracy: 0.8130\n",
      "Epoch 9/9\n",
      "7982/7982 [==============================] - 0s 33us/sample - loss: 0.2703 - accuracy: 0.9381 - val_loss: 0.8669 - val_accuracy: 0.8240\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x7fd5afd42110>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 6. 优化模型 #######################\n",
    "###############################################\n",
    "# 从上一步分析可知，模型在训练第9轮后开始过拟合，新模型共9个轮次\n",
    "\n",
    "model = models.Sequential()\n",
    "model.add(layers.Dense(64, activation='relu', input_shape=(10000, )))\n",
    "model.add(layers.Dense(64, activation='relu'))\n",
    "model.add(layers.Dense(46, activation='softmax'))\n",
    "\n",
    "model.compile(optimizer='rmsprop',\n",
    "              loss='categorical_crossentropy',\n",
    "              metrics=['accuracy'])\n",
    "\n",
    "model.fit(partial_x_train,\n",
    "          partial_y_train,\n",
    "          epochs=9,\n",
    "          batch_size=512,\n",
    "          validation_data=(x_val, y_val))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.684314Z",
     "start_time": "2020-05-12T16:09:30.464327Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.9690361220392922, 0.7907391]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 7. 验证模型 #######################\n",
    "###############################################\n",
    "\n",
    "results = model.evaluate(x_test, one_hot_test_labels, verbose=0)\n",
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.874666Z",
     "start_time": "2020-05-12T16:09:30.685113Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.0336036e-03, 4.8208452e-04, 1.9767179e-04, 7.5442469e-01,\n",
       "       2.0559447e-01, 1.5529558e-04, 4.1876399e-05, 4.6892770e-04,\n",
       "       7.6320474e-03, 4.0857031e-04, 6.3446542e-04, 3.7261362e-03,\n",
       "       2.1986533e-03, 2.1254749e-04, 1.7935918e-04, 1.6657845e-04,\n",
       "       5.0199302e-03, 2.4665252e-04, 1.5899650e-04, 2.7954245e-03,\n",
       "       5.0903852e-03, 7.3358015e-04, 4.0157832e-04, 7.5854827e-05,\n",
       "       4.9616920e-04, 3.3880264e-04, 7.5204829e-05, 1.2921463e-03,\n",
       "       2.5830037e-04, 1.1150693e-03, 1.1767257e-03, 4.3231438e-04,\n",
       "       1.2131906e-04, 1.3642397e-05, 1.1687732e-04, 2.0529654e-04,\n",
       "       1.1658194e-03, 5.5969304e-05, 9.8755001e-05, 4.0920320e-04,\n",
       "       1.4301970e-04, 1.9611442e-04, 4.7746053e-05, 7.0409485e-05,\n",
       "       7.5586344e-05, 1.6051599e-05], dtype=float32)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 8. 模型进行预测 #######################\n",
    "###############################################\n",
    "\n",
    "predictions = model.predict(x_test)\n",
    "\n",
    "# 模型输出为概率分布，最大索引得到预测标签\n",
    "predictions[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.877868Z",
     "start_time": "2020-05-12T16:09:30.875535Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 3)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 模型输出为概率分布，最大概率的索引为 预测标签\n",
    "np.argmax(predictions[0]), np.argmax(one_hot_test_labels[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 波士顿房价数据集：回归问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.890577Z",
     "start_time": "2020-05-12T16:09:30.878518Z"
    }
   },
   "outputs": [],
   "source": [
    "###### 1. 数据集 ################################\n",
    "###############################################\n",
    "\n",
    "from tensorflow.keras.datasets import boston_housing\n",
    "\n",
    "(train_data, train_targets), (test_data,\n",
    "                              test_targets) = boston_housing.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.893445Z",
     "start_time": "2020-05-12T16:09:30.891300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((404, 13), (102, 13))"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.shape, test_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.897039Z",
     "start_time": "2020-05-12T16:09:30.894197Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([15.2, 42.3, 50. , 21.1, 17.7, 18.5, 11.3, 15.6, 15.6, 14.4])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_targets[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.900497Z",
     "start_time": "2020-05-12T16:09:30.897754Z"
    }
   },
   "outputs": [],
   "source": [
    "###### 2. 数据标准化 #############################\n",
    "###############################################\n",
    "\n",
    "# 数据标准化\n",
    "mean = train_data.mean(axis=0)\n",
    "train_data -= mean\n",
    "std = train_data.std(axis=0)\n",
    "train_data /= std\n",
    "\n",
    "test_data -= mean\n",
    "test_data /= std"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.904236Z",
     "start_time": "2020-05-12T16:09:30.901237Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.27224633, -0.48361547, -0.43576161, -0.25683275, -0.1652266 ,\n",
       "       -0.1764426 ,  0.81306188,  0.1166983 , -0.62624905, -0.59517003,\n",
       "        1.14850044,  0.44807713,  0.8252202 ])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:09:30.907757Z",
     "start_time": "2020-05-12T16:09:30.904870Z"
    }
   },
   "outputs": [],
   "source": [
    "###### 3. 构建模型 ###############################\n",
    "###############################################\n",
    "from tensorflow.keras import models\n",
    "from tensorflow.keras import layers\n",
    "\n",
    "\n",
    "def build_model():\n",
    "    model = models.Sequential()\n",
    "    model.add(\n",
    "        layers.Dense(64,\n",
    "                     activation='relu',\n",
    "                     input_shape=(train_data.shape[1], )))\n",
    "    model.add(layers.Dense(64, activation='relu'))\n",
    "    model.add(layers.Dense(1))\n",
    "    model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])\n",
    "    return (model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:11:34.314366Z",
     "start_time": "2020-05-12T16:09:30.908453Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "processing fold # 0\n",
      "processing fold # 1\n",
      "processing fold # 2\n",
      "processing fold # 3\n"
     ]
    }
   ],
   "source": [
    "###### 4. 训练模型 ###############################\n",
    "###############################################\n",
    "\n",
    "# 用K折验证法来训练模型\n",
    "\n",
    "import numpy as np\n",
    "k = 4\n",
    "num_val_samples = len(train_data) // k\n",
    "num_epochs = 100\n",
    "all_scores = []\n",
    "\n",
    "for i in range(k):\n",
    "    print('processing fold #', i)\n",
    "    val_data = train_data[i * num_val_samples:(i + 1) * num_val_samples]\n",
    "    val_targets = train_targets[i * num_val_samples:(i + 1) * num_val_samples]\n",
    "\n",
    "    partial_train_data = np.concatenate([\n",
    "        train_data[:i * num_val_samples],\n",
    "        train_data[(i + 1) * num_val_samples:]\n",
    "    ],\n",
    "                                        axis=0)\n",
    "    partial_train_targets = np.concatenate([\n",
    "        train_targets[:i * num_val_samples],\n",
    "        train_targets[(i + 1) * num_val_samples:]\n",
    "    ],\n",
    "                                           axis=0)\n",
    "    model = build_model()\n",
    "    model.fit(partial_train_data,\n",
    "              partial_train_targets,\n",
    "              epochs=num_epochs,\n",
    "              batch_size=1,\n",
    "              verbose=0)\n",
    "    val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)\n",
    "    all_scores.append(val_mae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:11:34.351547Z",
     "start_time": "2020-05-12T16:11:34.315205Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1.33871632, -10.26128368, -10.46128368, ..., -41.46128368,\n",
       "        -18.16128368, -16.46128368],\n",
       "       [ 12.59985619,   0.99985619,   0.79985619, ..., -30.20014381,\n",
       "         -6.90014381,  -5.20014381],\n",
       "       [ 13.49619179,   1.89619179,   1.69619179, ..., -29.30380821,\n",
       "         -6.00380821,  -4.30380821],\n",
       "       ...,\n",
       "       [ 44.98001938,  33.38001938,  33.18001938, ...,   2.18001938,\n",
       "         25.48001938,  27.18001938],\n",
       "       [ 23.71952133,  12.11952133,  11.91952133, ..., -19.08047867,\n",
       "          4.21952133,   5.91952133],\n",
       "       [ 15.86559753,   4.26559753,   4.06559753, ..., -26.93440247,\n",
       "         -3.63440247,  -1.93440247]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "###### 5. 优化模型 ###############################\n",
    "###############################################\n",
    "\n",
    "predicted = model.predict(test_data)\n",
    "predicted - test_targets\n",
    "\n",
    "# 预测值与实际值之间的差别较大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:29:30.370599Z",
     "start_time": "2020-05-12T16:16:43.087900Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "processing fold # 0\n",
      "processing fold # 1\n",
      "processing fold # 2\n",
      "processing fold # 3\n"
     ]
    }
   ],
   "source": [
    "# 增加训练轮次\n",
    "# 保存每折的验证结果\n",
    "\n",
    "num_epochs = 500\n",
    "all_mae_histories = []\n",
    "\n",
    "for i in range(k):\n",
    "    print('processing fold #', i)\n",
    "    val_data = train_data[i * num_val_samples:(i + 1) * num_val_samples]\n",
    "    val_targets = train_targets[i * num_val_samples:(i + 1) * num_val_samples]\n",
    "\n",
    "    partial_train_data = np.concatenate([\n",
    "        train_data[:i * num_val_samples],\n",
    "        train_data[(i + 1) * num_val_samples:]\n",
    "    ],\n",
    "                                        axis=0)\n",
    "    partial_train_targets = np.concatenate([\n",
    "        train_targets[:i * num_val_samples],\n",
    "        train_targets[(i + 1) * num_val_samples:]\n",
    "    ],\n",
    "                                           axis=0)\n",
    "    model = build_model()\n",
    "    history = model.fit(partial_train_data,\n",
    "                        partial_train_targets,\n",
    "                        validation_data=(val_data, val_targets),\n",
    "                        epochs=num_epochs,\n",
    "                        batch_size=1,\n",
    "                        verbose=0)\n",
    "    mae_history = history.history['val_mae']\n",
    "    all_mae_histories.append(mae_history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:40:58.079598Z",
     "start_time": "2020-05-12T16:40:58.069687Z"
    }
   },
   "outputs": [],
   "source": [
    "average_mae_history = [\n",
    "    np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:40:59.605115Z",
     "start_time": "2020-05-12T16:40:59.500189Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO2dZ3gc5bWA37OrLkuuci+ysbHB4ALG9GYIveWSYgglXBLf5JJAKqEECJBCQhIgCUkgIYQQSkiol2K6AVNsXLGNccEdN7lbsq167o8pmp2dXa0kr+Ry3ufZR7sz38x+s9r9zpwuqophGIZhhIm19wQMwzCMPRMTEIZhGEYkJiAMwzCMSExAGIZhGJGYgDAMwzAiyWnvCexOunXrpuXl5e09DcMwjL2G6dOnb1DVsqh9+5SAKC8vZ9q0ae09DcMwjL0GEVmeap+ZmAzDMIxITEAYhmEYkZiAMAzDMCIxAWEYhmFEYgLCMAzDiMQEhGEYhhGJCQjDMAwjEhMQwO9fX8RbCyvaexqGYRh7FCYggD9O+pR3F29o72kYhmHsUZiAAGICDQ3WOMkwDCOICQggJoLJB8MwjERMQAAi0GCtVw3DMBLIuoAQkbiIzBSR5yP2fU9EPhaRj0TkdREZENhXLyKz3Mdz2ZxjLCZYb27DMIxE2qKa6zXAfKA0Yt9MYIyq7hCRbwK/Ar7s7tupqqPaYH5mYjIMw4ggqxqEiPQFzgb+GrVfVd9U1R3uyw+AvtmcTyoEMzEZhmGEybaJ6W7gWqAhg7FXAi8FXheIyDQR+UBELkh1kIhMcMdNq6hoWS6DiGDiwTAMI5GsCQgROQdYr6rTMxh7CTAGuDOwub+qjgEuBu4WkQOijlXV+1V1jKqOKSuLbIrUJDHBfBCGYRghsqlBHAucJyLLgMeBcSLyz/AgETkVuBE4T1Wrve2qutr9uwSYBIzO1kRjIjRkouMYhmHsR2RNQKjq9araV1XLgfHAG6p6SXCMiIwG7sMRDusD2zuLSL77vBuOsPk4W3ONWZirYRhGEm3ek1pEbgOmqepzOCalDsC/RQRghaqeBxwE3CciDThC7A5VzZqAEItiMgzDSKJNBISqTsIxE6GqNwe2n5pi/HvAoW0xN4BYzHwQhmEYYSyTGhDETEyGYRghTEDgRjG19yQMwzD2MExAYJnUhmEYUZiAwIr1GYZhRGECAkeDMCe1YRhGIiYgsEQ5wzCMKExAYCYmwzCMKExAYIlyhmEYUZiAwIr1GYZhRGECAtdJ3d6TMAzD2MMwAYEV6zMMw4jCBATmgzAMw4jCBATmgzAMw4jCBAReqQ0TEIZhGEFMQODmQViinGEYRgJZFxAiEheRmSLyfMS+fBH5l4gsFpEpIlIe2He9u32BiJye5TmaBmEYhhGiLTSIa4D5KfZdCWxW1cHAXcAvAUTkYJw2pcOBM4A/ikg8WxO0ct+GYRjJZFVAiEhf4GzgrymGnA885D7/D3CKOL1HzwceV9VqVV0KLAbGZmueVqzPMAwjmWxrEHcD1wKpLPx9gJUAqloHbAW6Bre7rHK3JSEiE0RkmohMq6ioaNEkrR+EYRhGMlkTECJyDrBeVaenGxaxTdNsT96oer+qjlHVMWVlZS2YqRXrMwzDiCKbGsSxwHkisgx4HBgnIv8MjVkF9AMQkRygI7ApuN2lL7A6WxM1DcIwDCOZrAkIVb1eVfuqajmOw/kNVb0kNOw54HL3+RfcMepuH+9GOQ0EhgBTszVXS5QzDMNIJqet31BEbgOmqepzwAPAwyKyGEdzGA+gqvNE5AngY6AOuEpV67M4JzMxGYZhhGgTAaGqk4BJ7vObA9t3AV9McczPgJ+1wfRcDaIt3skwDGPvwTKpsWJ9hmEYUZiAwHwQhmEYUZiAwIr1GYZhRGECAgtzNQzDiMIEBJYoZxiGEYUJCBwntckHwzCMRExAYE5qwzCMKExAYD4IwzCMKExAYD4IwzCMKExA4PWDaO9ZGIZh7FmYgMDxQZgGYRiGkYgJCCxRzjAMIwoTEHg+iPaehWEYxp6FCQgsD8IwDCMKExBYHoRhGEYUWesHISIFwNtAvvs+/1HVW0Jj7gJOdl8WAd1VtZO7rx6Y4+5boarnZWuu5oMwDMNIJpsNg6qBcapaKSK5wGQReUlVP/AGqOp3veci8m1gdOD4nao6Kovz87FEOcMwjGSy2ZNaVbXSfZnrPtItwxcBj2VrPumwRDnDMIxksuqDEJG4iMwC1gOvquqUFOMGAAOBNwKbC0Rkmoh8ICIXZHOelihnGIaRTFYFhKrWu2aivsBYETkkxdDxOD6K+sC2/qo6BrgYuFtEDog6UEQmuIJkWkVFRYvmKZgGYRiGEaZNophUdQswCTgjxZDxhMxLqrra/bvEPXZ08mGgqver6hhVHVNWVtai+cVipkEYhmGEyZqAEJEyEfEikgqBU4FPIsYNBToD7we2dRaRfPd5N+BY4OPszdU0CMMwjDDZjGLqBTwkInEcQfSEqj4vIrcB01T1OXfcRcDjmpiIcBBwn4g0uMfeoapZExDmgzAMw0gmawJCVT8iwiykqjeHXv8kYsx7wKHZmlsYK9ZnGIaRjGVSY4lyhmEYUZiAwKnFZIlyhmEYiZiAwAlzBavHZBiGESSlgBCRawPPvxja9/NsTqqtiYkjIkw+GIZhNJJOgxgfeH59aF+qfIa9kpirQpgfwjAMo5F0AkJSPI96vVcTcyWE+SEMwzAaSScgNMXzqNd7NWIahGEYRhLp8iBGisg2HG2h0H2O+7og6zNrQ8wHYRiGkUxKAaGq8bacSHtiPgjDMIxkmhXmKiLFIvIVEXkhWxNqDwTPB2ECwjAMw6NJASEieSJygYg8AazBKbr356zPrA3xfBAmHgzDMBpJaWISkc/hFNI7HXgTeBgYq6pXtNHc2gzfB9HQzhMxDMPYg0jnpH4ZeAc4TlWXAojIPW0yqzbGfBCGYRjJpBMQh+Mky70mIkuAx4F90nHdmAdhAsIwDMMjpQ9CVWeq6o9U9QDgJzilu/NE5CURmdBWE2wLRCxRzjAMI0xGUUyq+q6qfgvoA9wNHJ3VWbUxnonJivUZhmE0kq5Y32HhBzAKqAB+39SJRaRARKaKyGwRmScit0aM+aqIVIjILPfxtcC+y0Vkkfu4vIXXlxGNYa7ZfBfDMIy9i3Q+iGnAPByBAIn1lxQY18S5q4FxqlopIrnAZBF5SVU/CI37l6ud+IhIF+AWYIz7XtNF5DlV3dzEe7YIc1IbhmEkk05AfB+4ENiJ46B+WlUrMz2x22PaG5/rPjJdgU8HXlXVTQAi8ipOBdnHMn3/5uCHuWbj5IZhGHsp6ZzUd6nqccC3gH7A6yLyhIiMyvTkIhIXkVnAepwFf0rEsAtF5CMR+Y+I9HO39QFWBsascrdFvccEEZkmItMqKiqihmQwT+dvg9mYDMMwfJp0Urs5EM8CrwBjgQMzPbmq1qvqKKAvMFZEDgkN+T+gXFVHAK8BD7nbo8qJR67eqnq/qo5R1TFlZWWZTi0BK9ZnGIaRTDon9SARuUFEpgC3ArOBYar6RHPfRFW3AJMINRpS1Y2qWu2+/AtO7gU4GkO/wNC+wOrmvm+mxNxPwXwQhmEYjaTTIBYDXwImAu8D/YH/FZHvicj3mjqxiJSJSCf3eSFODadPQmN6BV6eB8x3n78MnCYinUWkM3Cauy0reBpEvQkIwzAMn3RO6ttoNOt0aMG5ewEPiUgcRxA9oarPi8htwDRVfQ64WkTOA+qATcBXAVR1k4jcDnzozcVzWGeDRhOTCQjDMAyPdP0gftKaE6vqRzjZ1+HtNweeX09yv2tv39+Av7VmDpmS48a51pmT2jAMw6dZ/SD2VeKegKg3AWEYhuFhAgLIiZsGYRiGEcYEBJDjhjHVN1hDCMMwDI90TmoARCQfJ6O6PDheVW/L3rTalhwzMRmGYSTRpIDASZLbCkzHqa+0z+H5IOrNxGQYhuGTiYDoq6pnND1s78XzQdSagDAMw/DJxAfxnogcmvWZtCNx80EYhmEkkYkGcRzwVRFZimNiEpxirSOyOrM2xHwQhmEYyWQiIM7M+izaGc/EZD4IwzCMRjKp5roc6ASc6z46udv2GSyT2jAMI5kmBYSIXAM8AnR3H/8UkW9ne2JtieeDqDMfhGEYhk8mJqYrgSNVtQpARH6JU921yb7UewvmgzAMw0gmkygmAeoDr+uJbuiz12I+CMMwjGQy0SAeBKaIyNPu6wuAB7I3pbYnbj4IwzCMJJoUEKr6WxGZhBPuKsAVqjoz2xNrSxprMZmAMAzD8EgpIESkVFW3iUgXYJn78PZ1aaqBj4gUAG8D+e77/EdVbwmN+R7wNZyGQRXAf3sRUiJSD8xxh65Q1fOad2mZ42kQtfXmpDYMw/BIp0E8CpyDU4MpeGst7utBTZy7GhinqpUikgtMFpGXVPWDwJiZwBhV3SEi3wR+BXzZ3bdTVUc141paTK75IAzDMJJI11HuHPfvwJacWJ3+nZXuy1z3oaExbwZefgBc0pL3ai3mgzAMw0gmkzyI1zPZluLYuIjMAtYDr6rqlDTDrwReCrwuEJFpIvKBiFyQyfu1FPNBGIZhJJPOB1EAFAHdRKQzjaGtpUDvTE6uqvXAKBHpBDwtIoeo6tyI97oEGAOcGNjcX1VXi8gg4A0RmaOqn0YcOwGYANC/f/9MppWEq0CYBmEYhhEgnQbxPzj+h2HuX+/xLHBvc95EVbcAk4CksuEicipwI3CeqlYHjlnt/l3iHjs6xbnvV9UxqjqmrKysOdMKzoGcmFBnTmrDMAyflAJCVe9x/Q8/UNVBqjrQfYxU1T80dWIRKXM1B0SkEDgV+CQ0ZjRwH45wWB/Y3tntZIeIdAOOBT5uwfVlTE5czMRkGIYRIJM8iN+LyCHAwUBBYPs/mji0F/CQiMRxBNETqvq8iNwGTFPV54A7gQ7Av0UEGsNZDwLuE5EG99g7VDW7AiIWMxOTYRhGgEx6Ut8CnIQjIF7EKf89GUgrIFT1IyLMQqp6c+D5qSmOfQ9o0yZF8ZhpEIZhGEEyqcX0BeAUYK2qXgGMxEl+26fIiYklyhmGYQTIREDsVNUGoE5ESnFCVptKktvrMA3CMAwjkUyK9U1znc1/wYliqgSmZnVW7UBu3HwQhmEYQTJxUv+v+/TPIjIRKHX9C/sUpkEYhmEkki5R7rB0+1R1Rnam1D7kxMQ0CMMwjADpNIjfuH8LcLKcZ+NkU48ApuCU/95niFuinGEYRgLpEuVOVtWTgeXAYW628uE4oauL22qCbUXcNAjDMIwEMoliGqaqXl8G3FpKbVKGuy3JjcfMB2EYhhEgkyim+SLyV+CfOOW6LwHmZ3VW7YBpEIZhGIlkIiCuAL4JXOO+fhv4U9Zm1E7kxIT6BvNBGIZheGQS5roLuMt97LPEY0JtvWkQhmEYHunCXJ9Q1S+JyBxCneAAVHVEVmfWxuTlxKisrmvvaRiGYewxpNMgPJPSOW0xkfYmPyfGpiozMRmGYXik60m9xv27vO2m037k5cSorjMBYRiG4ZHOxLSdCNMSTrKcqmpp1mbVDuTFY9SYgDAMw/BJp0GUtOVE2pv8nDjVdfXtPQ3DMIw9hkwS5QAQke4i0t97ZDC+QESmishsEZknIrdGjMkXkX+JyGIRmSIi5YF917vbF4jI6ZnOs6Xk5ZgGYRiGEaRJASEi54nIImAp8BawDHgpg3NXA+NUdSRO5vUZInJUaMyVwGZVHYwTRvtL9z0PBsYDw4EzgD+6rUuzRr4JCMMwjAQy0SBuB44CFqrqQJzucu82dZA6VLovc91H2KdxPvCQ+/w/wCniNKc+H3hcVatVdSlO7aexGcy1xZiT2jAMI5FMBEStqm4EYiISU9U3ybAWk4jERWQWThe6V1V1SmhIH2AlgKrWAVuBrsHtLqvcbVHvMUFEponItIqKikymFUl+Tpy6BrV6TIZhGC6ZCIgtItIBp8TGIyJyD5BRRpmq1qvqKKAvMFZEDgkNkajD0myPeo/73UqzY8rKyjKZViR5Oc5HYWYmwzAMh0wExPnATuC7wETgU+Dc5ryJqm4BJuH4E4KsAvoBiEgO0BHYFNzu0hdY3Zz3bC75JiAMwzASSCkgROQPInKMqla5mkCdqj6kqr9zTU5pEZEyt5c1IlIInAp8Ehr2HHC5+/wLwBuqqu728W6U00BgCFnug+1pEBbqahiG4ZCu1MYi4Dci0gv4F/CYqs5qxrl7AQ+50Ucx4AlVfV5EbgOmqepzwAPAwyKyGEdzGA+gqvNE5AngYxxz1lWqmtWVO98XEKZBGIZhQPpEuXuAe0RkAM7C/aCIFACP4UQYLUx3YlX9CKf7XHj7zYHnu4Avpjj+Z8DPMrmI3UGeCQjDMIwEmvRBqOpyVf2lqo4GLgY+zz7YMCg/x0mzMB+EYRiGQyaJcrkicq6IPIKTILcQuDDrM2tj8s0HYRiGkUC6Yn2fAy4CzsZxED8OTFDVqjaaW5tiUUyGYRiJpHNS3wA8CvxAVTe10XzaDT8Pot4EhGEYBqR3Up/clhNpbzwfRHWtCQjDMAxoRjXXfR3TIIzWMH/NNj6tqGx6oGHsRaQzMe1XmJPaaA1n3vMOAMvuOLudZ2IYuw/TIFwKch0T0y4zMRmGYQAmIHwKXQGxs8Y0CMMwDDAB4VOQ53wUO2tNQBiGYYAJCJ+8eIyYwC4TEEYbsqSikmUb9r3UIlVlR01GXQGMPRgTEC4iQmFunMemrmDuZ1vbezrGXkRtKyLfxv3mLU769aTdN5k25q2FFfxqYrhIMzz+4UoOvvll3vt0QzvMqmkemLyUF+esae9p7PGYgAhQmBdnQ2UN5/x+cntPxWgBj01dwfTlbZ/TuaMFfqt3F2/gj5MWZ2E2bcvlf5vKHyd9mrR98Xon5PefHyxv6yllxO3Pf8z/PjKjvafRKh6YvJQVG3dk9T0szDWAlyxn7J1c/9QcoO1DTVtiSvnKX8Pdd5vHrtp6P/JuT6C2voHceOP9ZoM6DSDXbatOGvvXd5aQnxvn0qMGtNn8guwL5XS276rl9uc/5sF3lzL5R+Oy9j6mQQRQtX7UexK7auv3Cvt8SzSI5vLwB8v9RLw3PlnHiFtfYf32Xbvt/FXVyULu/D9M5qQ738zo+O27nOOr6+p54sOV/vmi5vjolBX83+zd1yDy+Y9Wc89rizIev27b7vvc2gtPyG2oTBbAu5OsCQgR6Scib4rIfBGZJyLXRIz5oYjMch9zRaReRLq4+5aJyBx337RszTNIbYMJiD2Jqx+byUm/ntQqG38qpi3bRPl1L7Bg7fZWnytdaPTuSLxcvL6Sm56Zy6Wu1vHkjM+oqWvgxqfnUn7dC62+sZm1cgvDb3mZ1+evS9g+e9VWlmVowti2s5b6BuWWZ+dx7ZMf8cwsRwCs31adML+GBmXV5p1U78ZgkG89OpO7XkvbniaB1Vt27rb3zgYrN+1g7db0QszrW1Nbn901K5saRB3wfVU9CDgKuEpEDg4OUNU7VXWUqo4CrgfeChUGPNndPyaL82ycsJXZ2KOYtLACyCyyrLlC5N3FTtfcf09b2fyJhUilQbz68TqG/ngi81a3LujhJdeZunrrLjZV1TDpk/X++aH1Ta5mLN8MwDuLNjBlyUZmrNjc7HNs31XH+Pvf5/EPnc/Tu8Otrmtg265G7WTd9l3U1De0Kpz8kSnLmbYs2de0fZcjpMK/4+nLN/Pe4kZn+eqte7aAOP5Xb3LUL15PO8b7TdRn+aY2awJCVdeo6gz3+XacJkN90hxyEU63unajzpXGOTFpz2kYLt6/IZPs9uaGJ/fsmA/Ax2u2NXteYVL5IF5zF/DZKxsFxJufrOf4X72RNDadFvBJQMt5dtZnVIUEUmWEeShMQ4OmFKLBd/7y/R/wX398L+O5eXxaUcmHy6IFS4VrZpr72VZ+97pjCmpNxYIbn57LF/78PlOXbmLrzlp/+3ufbuSCe9/l4JtfThh/4Z/e4+KAz2d9hF+krbjqkRm75aakrTpftokPQkTKcdqPRnrmRKQIOAN4MrBZgVdEZLqITMj2HKGxUF/Q+bertp7tu2pTHWJkkZg4EiKTxb+5C443frlrQknnuNxZU8+jU1YkLZQvzVnDh8sSF6mmFtMbnp7Dyk3Jd7BRpoKNldU89N4ypgUis56Z+ZlfWNKj0r1Dr29Q/jN9VaQm/KMnP2LIjS9Fzsmbs0jyNnAczb+c+Elac9mSCF9Rl+I8AKa5guOc30/msanO4rijpp5dtfVs21XLlh01Kc8bJjiHL933PvMCIen/8/B05ny2NaHgZpT5LyhQ29ph/cKcNfzwPx+1+jxtla+V9SgmEemAs/B/R1VT3a6dC7wbMi8dq6qrRaQ78KqIfKKqb0ecfwIwAaB///6tmmudq64FBcS5v5/MovWVVoStHchEQNz49BzGDevOgT1KmnXu4DmnLNnIl+//gH9/42iOKO+SNPaXEz/h7+8to2fHfMYN6+Fv/2ZEmGRtvZKX48xbIhTRVKaVnbX15OXEePiD5fz65QVM+/GpPDFtFb90cwxKC3LYtquO2au2cvaIXrw4Zw3eGu4teA++u5SfvjCfhgblS0f0451FFcxasYVvnzKEf09fBcCkBes5aWj3yDkIjRMO3qHe8dJ8npm1mt6dCjm0T0c6FeZS3q044di1EWabowd1ZemGKh6ZsoLxYxN/mxsqqxl200ROO7gHO2rqmbVyC2ce0pM7vzjSH6OqSOhD3FzVKIzz4jH+/t6yyGtpaFBiMWFuwLxXWV1HfYMmCLOq6jrycvKSjq+uq0fV+R+mim5c417ztp11lJXk+wIxFbtTGO0O31kmZFWDEJFcHOHwiKo+lWboeELmJVVd7f5dDzwNjI06UFXvV9UxqjqmrKysVfP17HmFeY0fy6L1VsK5JSxYu52nZ65q1TmkCROTqvL4hyt5Z9GGZjuDvYU6FoMPljj3JW8tqEgY88S0lTw76zM/UmT7rqZNOWsiFsr123fx7KzPgNT+Ck9g3fTMXLburOWTNdsTnKkDujYuyKcM607Hwlz/9fZddUycu4ZfTVwAQL0rOS59YCq/eTXRefvVBz9k0oL1CdsaIjSIoFa0frt3/bVccO+7fmJfUFNZE+FULcqLM7Jfp8h9HjNWbGb5pioqq+v49/RVPDVjFeXXvcBpd70VGQq8scqZS9fiPIry47y9qIJLjkq+MbzzlQXU1jf4+RjgCLFxv57ECx81JsilMs8N/fFEht00kaE/nsjqLTvZuiPZinD0L97g6F+8wel3v82X7ns/5TUCTJy7lonz1vqvWyMsXp63luvckG5wnO7ZisDMmgYhjuh/AJivqr9NM64jcCJwSWBbMRBT1e3u89OA27I11zArN+3k8Ntf5Z7xo9vqLfc5Tr/bUfY+P7pvi8/haRDp7rrrG5TquoZmm5i8c9bXKwW50XW4rnVNAeeN7A00LqTpOPHOSUna5t1uCObofp1TLgyPTFlBcV7jneqMFZtZGwjH7NOpkDmuOaV7SQGdCnPZ4i5aM1du9oUDOL6bhwMJamHhGY6Q8T67oMMzKJw8n0e4mVZwcY2KuinOzyE/N8a2nbVsS2Gm3VCZaF56wrXPL1xXycJ1ldTVN5ATj7Ghspq/vLOEowZ1BaBP50I+WuV8HkeUd+HRKSsI+mv/NOlT/vXhSjZVNZ7/5Xnr2FiV+H6V1XVc9+RH9OlUyLdPGQIkmwmPueMNBpUV88b3T/K3BQUokCCIgvzf7NX8adKnSb6up2asYsG67dxy7nDA+R/98c1Pk8yHUcwPneuYO97gn1ceyXFDujV5bHPJpgZxLHApMC4QynqWiHxDRL4RGPd54JVQr+sewGQRmY3TD/sFVZ2YxbkCJCTubKyq4ZO1rXdg7u+ku7N5e2FFWvtzo5M6WkB4d/S19Q3Ntsnuche9mvqGQKl3Z9v05Zt4bOoKf6x3Z90QWB+DDt8jyjvz47MP8l9XVdexftsu3l6YqJE8MjV1VvHvXl/EL15qLFnx5oL1CYtuPBA4UVKQQ6eiRnPGv6clamrbd9Vx0zNz/dcL1yYuXvWh/4mn1QQXz4XrGk0Y3v8ouMhv2VHj3wRAag2iY2EuNfUNLFqXmSY+rGdpwmvvvLc//zH3vbWEZ2Y6mljfzoX+mJF9O/kLa1Cz2hQSBne+vIAwGyqrefzDlQmaVjgIAGBJRRVTlzZawKOiqDyCAvmNT9ZHBkL8+pUFPPjuMn/sIx+s4J7XF0XOEeDnL87nFVcDiQqiqajMTm5HNqOYJquqqOoIL5RVVV9U1T+r6p8D4/6uquNDxy5R1ZHuY7iq/ixb8wxy63nDOe3gRhuzdZdrPanu7HfV1nPZ36Zy+d+mpjy2KR+EJyBqWqFBVNc1+JqBd44L//S+n5UdnEdwYQ0mlh3SpyOlBY0L0zWPz+SCe99ldWjR/MvbSzKa29AeJUxaUMGcz7ZS3rUIgGMGd/X3lxTk0KM033+9dEMVw3qWcLV7Bxxc3AHO/UNi6ZjXPl6XMH8vCmt9QGP50ZON1+858h98d5m/7d3FGxOypKNMNcX5Of7nEqxvNqR7h8jrhkbB+7XjBgKwYtMOd47O/8sTGH06NQqI/l2KyHOzuDsXNf4fgvz884cmvPaE/qUPJH7/dtXWs7kq+aaltCCHa/8z238dNj1777tg7XaG/ngiY3/2Glc/NpNtO2vpkJ9sqPE0J+87HJWoGOT+t5cw4eHpAOTEk5ftbDnbLZM6QCwmFAXU/H0hJb+9SRUC6v3gZ69KnSPg+yBS/B+86DJHQDQKkfXbdvHwB8vT5rXsdIVBTV2DP5cnZ6xKiJf35+EdE7izDC6IMZEE08Br89cnCQeABnUW96MHdU3aF+Tckb385xeM7sO0H5/KOSN6+9tKCnIZ0j3RKV9Wks/3PncgxXlx3l+yMe3531xQwfBbXua52atZv22XHwXl+Roy4apHGx30JQWNC+AH15/iPy/Mjft39J557KOfnMZ/u4t/FJt31NC/SxFXhASEd9M8dekmcuNCz46NAiIWE/JcR3JQswpy8ZH9GTuwMQChR0lBwv7ORbm8NGcNw26ayIch7UAELo01mYEAACAASURBVD16ACs37/S/U8tDCYQd3M/Ay3Zfv72a52avZt7qbQztWcKNZx1EFJ6ASJfOENTCq+vqE8xZh/bpCEBVdXaimkxAhAhK52xk8LYlyzdWtTpJq7WkcspmkijlRbBc/dhMVm1OzuhNMDEF1PpfvbyAm56Z69v+AV6ZtzbB7LIzYGIKLvzf+deslPOoCgi74A+yX+fChDpE6Th8QGf6dylKO+aAssY77F4dC+jWIT/hxqWkIId+XQoTjvEWxpKCXD+M1tMoUnH1YzMZ+/PXeco121RECIiSiLvfIN85dYivEeTnxOjZsXHh7VFaQGlhowbRqSiX0oJcvzlXFCs37aQ4P4eepQXkxsUXEEET2/+eNJgO+c45vJsIr2VwukiiTgHzU3F+4xyG9y5lR009by9yTILhMiB58Ri9OxVS36C+EF25KfH76H0ftoSc2Wu37aI4P4fuAY0vyPZdtWyqquGlucmVZT2fUPA39Pl73+M/0xtNig/991h3THZKq5uACBH8oQc1iGxnLEbx6JQVnH5XUmRvxpx45yTO/l3bVqadsWIz5wdMGikFRIrtf31nCUf+/DWg8a4RiCzN7N3F19Q3mphigm/7f+j9Zb7Tc8LD03n4g+X+3ZincaiSkOcSVQDPO2ZHdbIGcdHYflx2dDm58fTJlYf17wQ49vL+rtloZL9OkWMPCJhgepQ6C27we5mfE0s61lv8vLv5vHiMc0b0ojl41/TE/xzN1acM4dGvH0mn4lx3HtELXOeiPEpcM1LYlDKorNjXID5Zu50BrmD0ggIg0ZcAzk1NcV6ceEzo27mIP036lKdnrkr4Hp07sheFec575cacc3mColPAxDT1xkZtBhrv8qExpB1gRN9OVNc1+POftzrRZ5CX4wgIgA+XbWL99l0s35SY97Gpqoaz7nmHVz5eS5gO+XHKSho/v6Cw376rjmsen5mQDOnxoyc/4q2FFQnmp7A/o6Qgh5yYRPpNdgcmIEIEf+hBAdEe2sQNT89hwbrtNOxFNaJ+8ty8BLNR1J3NjBWbOfW3b0Ue/9MX5rPOrd8TC8RdRsWiewt7dcDE1KDBsMw6rv3PRwkq+nb3xxbUYLYEIlKiip95ESuJGoTz/MLD+hKLCblNRJ9893MH8sPTh/KNEw/gsqMHcMGo3vzlssNZdsfZ3DN+VMLYoPmjV8fC8KkQEYb1LOW1753AYFeYeDZwbxHsUpyX4LBtDl075PG9zx3IMQd0o7OrmRw+oLNv5w/SqSjX1xKKQwJiYLdiSgOLch9XGOQHhPCXx/QjLyfG2Yc6wmzbrjr/PJ7w+O6/Zic4nMu7FlPkniMnJJi7BExMXYsThVpQG6oN/LYP6uWY6zyzYNjUlp8To7f7f7jm8VmM/dnrrN6SbEL8eM02JoVCpQGK83IS/o+XHDXAv94lFZW8syi6Z8Z/pq/i8r9N9b+zUeTGYxTlxbPWKtkERIjgnVp1OwsIj12tLPjWll3ywvfRURrEc7MSVfgoB2d1XUPCuYLaxJsL1lOxvTrjKKag2r/B/fEHf1BbdtTSr0sht5x7cOR8PaHhaRCqyh/ecHo5eIuZdyc7trxL5N32kO4lXHXyYArz4pQU5HL3+NF0dwXBmYck3ukH73SDJpswg7uX+Atix4CJCZxFPug4bw5dA2YaT8h0Lsrjzi+OSLgT9rZ7WktYQBQEfBAAZR2cYz3Bf9zgbnz7lCEsuP0Mfnj6UH+cdycfNCttDITD5riLIjT+Xr17ic6BucdjwqCyYv/c3xo3hBMPdHKlvnpsOb/+4kguGtvPN8+FKwe/8f0TAc/ElPh/qG/QlKbCYLgyOJ9Lv4CmdNVJg7nuzGEA3PTsvMhzBGnKgV2cn9PkmJZi/SBCBAVEUHLXZblqYjp21NRTlNfyf9XGqpqEqI9sEs58jVpww+GHUZEeO2vqE8wAXsG3nTX1XPHgh3QvyeciNzu3pq4hqTZNr44FfsTL9OWbEXHMSRf/ZQqvf//EBIGyZWctxXk5/oIdxos4qaqpY/KiDWzeUcNU15HpzbvWjYHNz41xw1kH8dGqrTwweSngLDDdS6JNNEBS7HtwYQzegUfh2dLDJqauHfITTDnpuPSoAbw0dy0bKqvpUpyX4Oj1hPDBvUs5f1Qfzh/Vh/LrXvD3BwWE9/fBK47wE8uCAqKbKyDq3c/Ku04RoWuHxvf0Fv+gr6KispqTh5Zxg+vsLfQFhHsO93bCez9PyAVzF8pK8n2bvccXDu/LW65Jct7qbQwqK2ZojxLOHdmb3p0KKSnI4cfnHExJQS5FefGE7/OBPTr4PpIg/boU8YeLR/Pdf81mzmdbKc6PJ/g2C/PiKJmvJ03V2grPa3diGkSIoIlpW8D00J4axI5WRihEOR+37qzNSvXaeCwsIJK/3JtDuQ9RY3bW1ieEGXv/C8/2u357td9roKauIamzVr/OjXd3X/vHNL8sxdptuxh+y8ss2VDl33Vu3VFDYV6czsXRd9y+BlFTzyUPTOHbj83093l3zV5eRX5OnPNH9eGmcxoLF/ftXEisiQKQs285LeG1t8CFBW4Y7/1dBcZ3cOfFY4gI8249Pe3xAF8/fhBXulFDYYHkLYAj+0b7S/JzY3Rwb14GutneJw/tzgWjnbqcOfGY/zl3K/EEhPM6KBg75Of4r71r+sl5wxnklvSoqWtgTHkXhrglVbwbprAGkZcT496LD+OZq45t8ro9EoRYcT5/uuRwzjq0FwW5ceb85HTOcs1BYef6YDeS7KBepTz29aMY5fqFOhbmMrh7CYPKihOuxyMvJxYZ+pqK4Hc76kavOD8nwfy5OzEBESJo9w5mS7Znr4gdtZn/85dvrPLD4LxL2RASEDV1DYy89RUG3/gSdzejjn6YU34ziZ+/OJ83F6z3P6tMTEwbQ9mzUSF6O2vrE3xAXpLWsg2NPxbvOrfurOX/Pko0W/Xt0rTG5C0MW3bWUpQX9+3tYTztJNxHYGx5F9/2790h9gqYhB6fcBR/vuRwfv5fiTH46ebi8cb3T2LKDYlO1vsuPZy/X3FEwrbhvZ0wR8+cdJQbyrl0g/PZhBcngCU/P4tPbj/Df11amMNxg50s3HAHuC8f0Q+AoT2Ta11ddvQAhnTvwBo3f2JwivyGAtd/5GkQJx5YxkVj+3H7+Yf4Y0TEF4re4tmjtICffr5xTND05QmTsA8iPyfG2SN60a+JSLEgB/bo4H/+C9enrnEUjlQb4AYb5MaFow/o6l+f9z3yFnPvev5+xRG+IM6JxxIETlFe6siu5wJRVZ7QCVKYmz0NwkxMIYIOzQQB0Y45Ec3555945yTAabvZqTCXzTtqkxyv05c3lmW++7VFfOfUA1s0r08rqvi0Ygn3v72E4wZ3459fOzJBwAL89tWFVGyvZsIJg8iNx4jHJKlMQdTdz86a+gSzkXfMikD0yJqQU7F7Sb7/3FtMOhc5n0EU3Trks2VHLVt31lKYm5NSQHiEI03uv+xw/w7/lGHdufmcgxk/tp+//6gm8h3CvPrdE/xr7liUS0cShcbpw3smHTPhhEEM61nCSUMd2/ro/p2BxoUd4J1rTwacPgPg5A0UxIJhs7kM753LMQd05avHlCec/9rTh/KdU4dEhvF+/7ShiAhHDerKo1NWcPKw6FpoBbkxdtbW0801I+XlxPjFf42IGOfMKSjU+nZqXOiDIazegnqYe70emYYbBynKy2Hqjacw9McTOXJgcrFG/9xuEcZD+3TkK0f29+frfee9DOcB3Zw5e075YlfbOWlo94RCiR0Lc/1giTHlXfjuqUO4/qk5Sd+z9z5tzGs5oKyD79T2tMPi/Jzd2l0wiGkQIYLZskETU11D6wXElh01lF/3Ai/PSw6FS0eUienhD5Yzce6alKaiyuo6Xw2/7qk5PBSoevluRDJYc5i8aIPfrMbDz94NqRAV26v57asLGXbTRH7479n+3IJEXd+yjVXUNyjf+9yBHNa/E9t21rnbGzWIcHmHYIijt8icHKpc+tT/HuM/95ymqs6C0ylFFm743B7Bu/5YTPjv4wa2ylc0pEcJh7iJT5kSjwknD+vuC6rCvDif/vwsJpxwgD+mX5ci+nUp4rbzh/N04PqD54jFhEe/fhSnhYSQiKSsZurdGZ87ohcf33a6b3IJ490pNxVV5eW6jClvXPR7dizwNeGgn6JHaQFPfvMYfnmhI2i8r11UpFUm5OfEmfyjk7nry6NSjvGu49dfHMn4sf393AvPerjJNZ2e5QYdeBpElBYHjQLv4F6l/PZLIxndvzMvXXM8Dwa0xNvPH55wzMnDGr/P3nmL8uKtNkOnwgREiOBaGwx/rKlrvYlpoVuP5oF3ljbruCgb/U3PzOUb/5zByFtf4donk+vLz/1sq2+XBrjlucZoiXDBsnSs3borqZ7SJQ9M4ev/SOwC61ng0pnan5r5GaqaFHHhaRBLKhozRL/1qGPnz8+JUZyfw+TFG1iwdjvLN1b55oVwbopnZsnPifl3bb07FfqLxiVH9U+44wxG5HTtkBeZA+Hx9eMHJW1ryj/QXoT9QB6XHV3uaxi7831EJK1gvP+yMZw7sneTCYK/Gz+aH54+NKHkel5OzA/7DWt4hw/onPQ/y6TYXSr6di5Kex1/uPgwvnh4Xw5wzTzee3ufw08vOITvfe5ARvR1hPyY8i781+g+HFEe/Zl7Pq+vHlvum6dEhG6B8NwzD22McHvluyf4UVhBivOy54MwE1OIYMXO4LpY19CAqvKzF+ZzxiE9GRPRNyDMO4sq+NajM3nvunEp7yIyoams46dmfMZvv+Tc+Xh9A5ZuqCJVnbxMS2M/OmUFNzw9h0e/fiTHHJC+UqTfdCbJC9FIYW6c6rqGhOgkaPRBjPtNcm7Eys07GNWvE+8s2sCrH69l2YYdHNK7lBkrtiSN9e7yOxbmcvGR/Vm5eQf/c+Ignp39GSs37UxyMno/Skj0HXhcNLY/1bX1PDPrMy4/ppwzD+nJzBVbOHFoWdbiztuSh68cy5qIeP7dzSF9OvL7i5qujBxcDIP06VzI2m27kvIaomiJiSlTDuxRktCvwhNG3o3CgT1KEvqSdMjP4bdpNBIvWixcfM9LpAQnMuy1753IjOWbU/Y8OXFoGT3ShEO3BhMQIVJlTNfWN/Da/PX8dfJSPly2iWe/dVyT5/rFi5+wdWctSzdUcUifjr6q3JwQN0h24qZLnPPuZoLF5sKEyzYHWb1lJ5f8dQr/uHIstz3vaB2ZtGjMpBR2aWFOZMheujIBh/bpyJeP6M/9by/hb+8uY1NVDacc1D1SQHgJW6WFuRTn53Cb6wTt1bEwUkAENQivts8JB5bRp5OTE5EXj9Ggyi3nDqdDfg4dyjowqCx1obm9jeOHtKx/yt+vOCJleets0LtTIbNXbqG0MPVy5S3SrdEgmov3lY+3UJMc3a8TL3y0Jsn0FnydnxNncPcOCQEA9158mO/fADjr0F5+pNXuxgREiLCA6FlawNptu6itV993UBphS62rb+DZWav5/Og+fkijl+CWaTx6mHhMqG/QpAW0perkzpp6pi/fnKRBNDQoc1dvZfaqrX69okenrPDLV2SicXgfW7oKuBsqayKb7qQqNPb+9ePo6ZaaKCnI9Z3tqe6kvB9WOFTT0w4K8sIaRF7SmH+E4uRjCB2LzBIbJOxszTZnHdKT4rx4Ria9/DYUEJ6/MpVJryn++9iBDOtZyrGDk4MZbjhrWIJzOsjZzSyh0hpMQIQI3wn36uQIiBkrNvs1fsLhjgCPTV3BTc/OY0dtvd9XwouN9xZP784/0+ZPUVVEwelO1RJ+/MxcnpyxKqn+zdMzP+P7/56dsC24kAcX8Dc/SexG5uF9bumESX2D+nH1PUsL6FSUy9INVSk1iJ6lBf6iUFKQ4wuI04f35KZn56LqZK16dWg8H0T4jszLRk4yMQU1iNLsqOhG6znz0F4pzU8e3m8lmyamVO/Z0hvAWExSNvmZcMIBCYEG7YXdGoUIaxCeg+xXExf4IZSrNie3+PPCEx+cvJRxv5lEdV29X6bai+ePakzvsXVHLc/NXu2fV1V9W/2GymoWrN2OqrKpqiay6fn5977LWwsrkuz7QRascwp9hWvNBDuXeawMVE+tqq5jxcYdqCpX/P3D6JOrU9Kjqb4M9731KeBEgkz8zgl+ks/GiBpIwTtGL6zx6lOGhJzLjc87BkxMQbw6OkkmpsCxPUxA7BO0oXzgmAO6cuVxA5N6TexLZO3jFJF+IvKmiMwXkXkick3EmJNEZGug49zNgX1niMgCEVksItdla55hLjzcaZHpJaSE6+p4jtZn3B7DHl4I3pINVSypqOLT9VX+nX9tfQMNDernH0Qt4b94aT5XPzaTO19ewK3/Ny8hB+Ch95dz+t1v89SMz1Lafmev3MLlf5uatoeFF68dHhPVICVY7/43ry7khDvfZNbKZLu/x/bqOobdNLFJ27SnNnslIory4qzbVs3hP30t7XGePPZKSnivg7HxXvmFcA0iX4Nw93u1crpEJF4ZeyntEFCWE49x0zkH030fvrnI5q+iDvi+qh4EHAVcJSIHR4x7J9Bx7jYAEYkD9wJnAgcDF6U4drdzWP/OLLvjbL8IWviff/aIXnQpzuNPkz5Ne56NVdV+9FFtvfLKx+u4K03Wsrdo/3HSpzz47rLI4nMfr9nW5AIcrkkUJJUN97MtOxnQtYjfBCI0loYKlwEpbaKZEL5792LoO+TnJOVUROGZsML5CAf3bmxR6UWDhE1MA91yDZ5AeO7bx/HrL46kR2kBFx7Wl5euOb45l2LsgaTK1TBaRzZbjq5R1Rnu8+3AfKBPhoePBRa7rUdrgMeB87Mz02i8aJuw6eHUg3pw8dj+LFxXyT2vLfIX8vBdedBPUFffkNDwJqpPc7hkQDjbGJw8gdZEj6RqWbB84w76dymKdL4H+aCJTmVhrjxuoB/7/tVjyxP2eWG/3x43JLLJS9hZ7Jn+PAHxQzfDNxhj7n2G4WiXA3uU8OLVx/vlJA4o68AXDu9LPCb85ksjOahXYh9kY+/jvksO5xsnHpDQbMloPW2iV4tIOTAamBKx+2gRmS0iL4mIlzbYB1gZGLOKFMJFRCaIyDQRmVZRkVyLvaU0CohGE9N7143jjEN6+netd73mZAgvWLs9SUA8MqWx6X1NfYNfETQV4f2fbU52hC/dUMXabcnbMyWVd+KTtdvo27kw6S5/QNeihMU7Uw3CK3PRr3Mhb197MnN+chpXj0vsbuYJiLNH9GLGTZ9LcBJ//fiBnBBKCPIERMdC59xXnTyY75x6ID1LGx3uObHkxvUeB/cu3WMT24zW079rEdedOcz+x7uZrAsIEekAPAl8R1W3hXbPAAao6kjg98Az3mERp4pc31T1flUdo6pjyspaFtcdhZeJG0zO8bpKHT4gMTNy5orNaU07tfWaUA8p6kLC9ZK8zlFexFHHwlxWbNrBsg07GNmvE8vuODvzi3FJlY7foE6WbTAaIy8eY9IPTkqIoMq0q95lR5fzx68cxni3HHdJQa5v/wc4d2TvpFBU772/cmR/fhDoDeBR5wuIxMXfq50Tk8ZKvC3tg2AYRiJZFRAikosjHB5R1afC+1V1m6pWus9fBHJFpBuOxtAvMLQvsDp8fDb56+VjuP2CQyKbv/QoLUiokVJT35A2/r+2viGyU1mQcIVTr+2hJyAuPrI/IsLHa7YlNSTJlNVbU2sfB/UqTShbMP/2MxAR348SFcqXqnZR1w55frnkKH554aFJd3re2HNG9I60J3vlDUpCgiUWE969bhxv/fBkX4NoylRmGEZmZDOKSYAHgPmq+tsUY3q64xCRse58NgIfAkNEZKCI5AHjgeeyNdco+nUp4tKjBiQ0+gjSMVAXZleoNHWYsIBYUlHFGXe/7VdgVFUqQgJk3uqt5MaFcrfG/pDuHfza+C0t2xGVpBYkeJcfTv4Z6ianDe7egee/fRzL7jibb5zoxGmHy1QEE9Ai3ydCcHhtKPNyok0Ed48fzQOXj4kMR+3TqZB+XYoYVFZMn06FKctOG4bRPLKpQRwLXAqMC4SxniUi3xCRb7hjvgDMFZHZwO+A8epQB3wLeBnHuf2Eqjbdmy8LeJEx4XopwTvZTVW1kQ2Fhru+itp6ZcP2Rg1h685aPlm7nbE/e50Plmxky45aauoaEt5j4bpKenUs5NozhvHVY8o569Bejb1/QxrEH79yWLOv639OHMTo/k6DEy/EM2rh9vAatXQuyvUrjnpZqyUFOcy86XP+2GCNoyii7MTdXL9FKitWx8JcTjmoR9rzDirrwLvXjbOcBsPYTWQtk1pVJ9NEdLKq/gH4Q4p9LwIvZmFqzaIoL87Xjx/I+aMSfeRBG/rGyuq05aBr6hrYWBVtYrrh6Tnc5RbaO6hXKXM+2+rv69elkC7FefzkvOEJ7+lpEK989wSWb9zh5xQ0h7IO+Uw4fhDffGQG+a6WlK6aaW9XSwja9z3B0qkwL6EXcNcUAiI3LimTBe+4cAT/eH8Zh+/GaqOGYbQOK7XRBCLCjWcnp2CUBBbKDZXVkR2hPKGxobI65cKoCl+8730ADupVkiAgDuqZGH7pvacnILzqkarKt8cN5vdvLE57LX07FzK8dykvz1tHXk7ML0uQToN49bsnsHRDFSvdqKrg3b/nK+gYEo6pTExTbzg1pa+mrCSf75+W7Jw2DKP9sPTRFhI0MW2sqolc+LyQzHBjmyBLN1T5/ouw7TyYBAaNgqE4VLNeRJI0nChuO3845a4fY/uuOl8weH+jCp0N6VHCacN7+hnMQTyzWnhfqn67nYvzzPxjGHsRpkG0kKAGsX1XXWSYqxf5szYiemhseReWb6pK6AEcdj6HE7g8H0WUSakwRWTTLecezNEHdKV/F6cZipdot7GyJkmDiKWpSum9Z9B9sMVt5elpSscP6cY7izZYLLph7COYgGghQUfx5h01rIsoeOct6FEaxIWH9yEei/EDt4rqg1ccwVp33H8d1ocvHNY3SUAEO3iFSeVgzo3HGBYwVXndukb07ehHDGXWptEZG0wC967Pa6344FePSFss0DCMvQsTEC0kuEhv2VHLu4ujs4xFosuD9ygtoF+gBePJQ7vzrw+d7OucmHDM4OQywJ6AiGoYlEpAhMuXj+7fmSk3nEL3knxmr3L8HZkUqvPyMYJJgpcdM4CcuHCJW948Jx7DSuIYxr6DCYhW8NYPT+LRqSu4760lkftVnTv4bbvqiEliCGfPjgUMdHMcPE49qAcDuy1hwgnJ/Y+h8Y69PqKWU6pGKVE9dj0/QJ3rQwgKiB+dMcxPSgtySJ+OvPrdExJq3eTnxLni2IGR72sYxt6PCYhWMKBrsd9rIIrOxXnkxWPU1DVQVpKf4G/oWVpALCb8/Yoj/P4GXTvk8+YPTkp5Pq/NYFSeQdB/kJ8To7qugVvPG87nR6d2XnuO9YLAbf83T0rdpGRIik5uhmHsm5iAaCXh0g/gLP7XnDqECw/ry1/ecbSLfp2LfAHRpTjPz5FoTuvGS44cQFmHfE4f3jNy/63nDWdUv07kxmO88ck6Lj+mPO35jijvwvgj+nHVyYMznoNhGPsPJiBaSUmKwnAXuYXqvEihvp0LmeY2DJoRyDpuDrGYpG29GBQI4RDZKHLjMe64cESL5mIYxr6PCYhWEqVBXHJUf/+5Z/np27mIR752ZNqifoZhGHsSJiBaSTgpbMnPz0rIFfCqtPbrUsixEZFJhmEYeyomIFpJuBNcONnMywuwTleGYextmIBoJUN7lPC9zx3IhspqThiSumHR8N4d23BWhmEYrccERCsREa4+ZUiT41KVwjAMw9hTMQGRZe69+DC/FaZhGMbeRNYEhIj0A/4B9AQagPtV9Z7QmK8AP3JfVgLfVNXZ7r5lwHagHqhT1THZmms2OXtE6rBUwzCMPZlsahB1wPdVdYaIlADTReRVVf04MGYpcKKqbhaRM4H7gSMD+09W1Q1ZnKNhGIaRgmx2lFsDrHGfbxeR+UAf4OPAmPcCh3wA9M3WfAzDMIzm0SYNg0SkHBgNTEkz7ErgpcBrBV4RkekiMiHNuSeIyDQRmVZRUbE7pmsYhmHQBk5qEekAPAl8R1W3pRhzMo6AOC6w+VhVXS0i3YFXReQTVX07fKyq3o9jmmLMmDHWjMAwDGM3kVUNQkRycYTDI6r6VIoxI4C/Auerqt9UQVVXu3/XA08DY7M5V8MwDCORrAkIcTrqPADMV9XfphjTH3gKuFRVFwa2F7uObUSkGDgNmJutuRqGYRjJZNPEdCxwKTBHRGa5224A+gOo6p+Bm4GuwB/dDm1eOGsP4Gl3Ww7wqKpOzOJcDcMwjBDZjGKajNfIOPWYrwFfi9i+BBiZpakZhmEYGSAa0b5yb0VEKoDlLTi0G7C/5VvYNe8f2DXvH7TmmgeoamQhuX1KQLQUEZm2t2ZqtxS75v0Du+b9g2xdc5vkQRiGYRh7HyYgDMMwjEhMQDjc394TaAfsmvcP7Jr3D7JyzeaDMAzDMCIxDcIwDMOIxASEYRiGEcl+LyBE5AwRWSAii0Xkuvaez+5CRP4mIutFZG5gWxcReVVEFrl/O7vbRUR+534GH4nIYe0385YhIv1E5E0RmS8i80TkGnf7PnvNACJSICJTRWS2e923utsHisgU97r/JSJ57vZ89/Vid395e86/pYhIXERmisjz7ut9+nrBaaImInNEZJaITHO3ZfX7vV8LCBGJA/cCZwIHAxeJyMHtO6vdxt+BM0LbrgNeV9UhwOvua3Cuf4j7mAD8qY3muDvxGlQdBBwFXOX+L/flawaoBsap6khgFHCGiBwF/BK4y73uzTjVknH/blbVwcBd7ri9kWuA+YHX+/r1epysqqMCOQ/Z/X6r6n77AI4GXg68vh64vr3ntRuvrxyYG3i9AOjlPu8FLHCf3wdcFDVuXaBHxwAABCdJREFUb30AzwKf28+uuQiYgdOVcQOQ4273v+fAy8DR7vMcd5y099ybeZ193cVwHPA8TkmfffZ6A9e9DOgW2pbV7/d+rUHgdLhbGXi9yt22r9JDnU5/uH+7u9v3qc8h1KBqn79m19wyC1gPvAp8CmxR1Tp3SPDa/Ot292/FKZi5N3E3cC1Or3tw5r8vX69HVBO1rH6/s94waA8nqpjg/hj3u898DuEGVW5F4MihEdv2ymtW1XpglIh0wumdclDUMPfvXn3dInIOsF5Vp4vISd7miKH7xPWGSGqilmbsbrnu/V2DWAX0C7zuC6xup7m0BetEpBeA+3e9u32f+BxSNKjap685iKpuASbh+GA6iYh3Axi8Nv+63f0dgU1tO9NWcSxwnogsAx7HMTPdzb57vT4a3UQtq9/v/V1AfAgMcSMg8oDxwHPtPKds8hxwufv8chw7vbf9Mjfy4Shgq6e27i2IpGxQtc9eM4CIlLmaAyJSCJyK47x9E/iCOyx83d7n8QXgDXWN1HsDqnq9qvZV1XKc3+sbqvoV9tHr9ZDUTdSy+/1ub8dLez+As4CFOHbbG9t7Prvxuh4D1gC1OHcTV+LYXl8HFrl/u7hjBSea61NgDjCmveffgus9DkeF/giY5T7O2pev2b2OEcBM97rnAje72wcBU4HFwL+BfHd7gft6sbt/UHtfQyuu/STg+f3het3rm+0+5nlrVba/31ZqwzAMw4hkfzcxGYZhGCkwAWEYhmFEYgLCMAzDiMQEhGEYhhGJCQjDMAwjEhMQhtEEIlLvVtD0Hrut6q+IlEug4q5h7Ens76U2DCMTdqrqqPaehGG0NaZBGEYLcevz/9LtxzBVRAa72weIyOtuHf7XRaS/u72HiDzt9m6YLSLHuKeKi8hf3H4Or7gZ0YjI1SLysXuex9vpMo39GBMQhtE0hSET05cD+7ap6ljgDzg1gXCf/0NVRwCPAL9zt/8OeEud3g2H4WTEglOz/15VHQ5sAS50t18HjHbP841sXZxhpMIyqQ2jCUSkUlU7RGxfhtOsZ4lbKHCtqnYVkQ04tfdr3e1rVLWbiFQAfVW1OnCOcuBVdRq+ICI/AnJV9aciMhGoBJ4BnlHVyixfqmEkYBqEYbQOTfE81ZgoqgPP62n0DZ6NU0/ncGB6oFqpYbQJJiAMo3V8OfD3fff5eziVRgG+Akx2n78OfBP8Jj+lqU4qIjGgn6q+idMcpxOQpMUYRjaxOxLDaJpCt2Obx0RV9UJd80VkCs7N1kXutquBv4nID4EK4Ap3+zXA/SJyJY6m8E2cirtRxIF/ikhHnMqcd6nT78Ew2gzzQRhGC3F9EGNUdUN7z8UwsoGZmAzDMIxITIMwDMMwIjENwjAMw4jEBIRhGIYRiQkIwzAMIxITEIZhGEYkJiAMwzCMSP4fhzWhgzNBNIkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()\n",
    "plt.plot(range(1, len(average_mae_history) + 1), average_mae_history)\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Validation MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:41:01.329844Z",
     "start_time": "2020-05-12T16:41:01.252181Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def smooth_curve(points, factor=0.9):\n",
    "    smoothed_points = []\n",
    "    for point in points:\n",
    "        if smoothed_points:\n",
    "            previous = smoothed_points[-1]\n",
    "            smoothed_points.append(previous * factor + point * (1 - factor))\n",
    "        else:\n",
    "            smoothed_points.append(point)\n",
    "    return smoothed_points\n",
    "\n",
    "\n",
    "smooth_mae_history = smooth_curve(average_mae_history[10:])\n",
    "\n",
    "plt.plot(range(1, len(smooth_mae_history) + 1), smooth_mae_history)\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Validation MAE')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:14:46.172116Z",
     "start_time": "2020-05-12T16:09:02.280Z"
    }
   },
   "outputs": [],
   "source": [
    "# Get a fresh, compiled model.\n",
    "model = build_model()\n",
    "# Train it on the entirety of the data.\n",
    "model.fit(train_data, train_targets, epochs=50, batch_size=16, verbose=0)\n",
    "test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:14:46.172487Z",
     "start_time": "2020-05-12T16:09:02.283Z"
    }
   },
   "outputs": [],
   "source": [
    "test_mae_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-05-12T16:29:30.549854Z",
     "start_time": "2020-05-12T16:29:30.547768Z"
    }
   },
   "source": [
    "# 小结：\n",
    "- 常见机器学习任务：二分类、多分类、标量回归\n",
    "- 处理机器学习任务的基本流程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
